//
//  attrparam.h
//  LTLBMC
//
//  Created by GD Huang on 5/18/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#ifndef LTLBMC_attrparam_h
#define LTLBMC_attrparam_h

#include <vector>
#include "unop.h"
#include "binop.h"
#include "astVisitor.h"
#include "OCamlObject.h"

namespace cilast {
    
    class typ;
    class typsig;
    class astVisitor;
    
    class attrparam : public OCamlObject {
    public:
        virtual int accept(astVisitor*);
    };
    
    
    class AInt : public attrparam {
    public:
        int mi;
        int accept(astVisitor*);
    };
    
    class AStr : public attrparam {
    public:    
        char* mstr;
        
        int accept(astVisitor*);
    };
    
    class ACons : public attrparam {
    public:    
        char* mstr;
        std::vector<attrparam*> mattrparams; 
        
        int accept(astVisitor*);
    };
    
    class ASizeOf : public attrparam {
    public:    
        typ* mtyp;
        
        int accept(astVisitor*);
    };
    
    class ASizeOfE : public attrparam {
    public:    
        attrparam* mattrparam;
        
        int accept(astVisitor*);
    };
    
    class ASizeOfS : public attrparam {
    public:    
        typsig* mtypsig;
        
        int accept(astVisitor*);
    };
    
    class AAlignOf : public attrparam {
    public:    
        typ* mtyp;
        
        int accept(astVisitor*);
    };
    
    class AAlignOfE : public attrparam {
    public:    
        attrparam* mattrparam;
        
        int accept(astVisitor*);
    };
    
    class AAlignOfS : public attrparam {
    public:    
        typsig* mtypsig;
        
        int accept(astVisitor*);
    };
    
    class AUnOp : public attrparam {
    public:    
        unop munop;
        attrparam* mattrparam;
        
        int accept(astVisitor*);
    };
    
    class ABinOp : public attrparam {
    public:    
        binop mbinop;
        attrparam* mattrparam;
        
        int accept(astVisitor*);
    };
    
    class ADot : public attrparam {
    public:    
        attrparam* mattrparam;
        char* mstr;
        
        int accept(astVisitor*);
    };
    
    
    class AStar : public attrparam {
    public:    
        attrparam* mattrparam;
        
        int accept(astVisitor*);
    };
    
    class AAddrOf : public attrparam {
    public:    
        attrparam* mattrparam;
        
        int accept(astVisitor*);
    };
    
    class AIndex : public attrparam {
    public:    
        attrparam* mattrparam1;
        attrparam* mattrparam2;
        
        int accept(astVisitor*);
    };
    
    class AQuestion : public attrparam {
        int accept(astVisitor*);
    };
    
}

#endif
